package com.baizhiedu.aspect;

import com.baizhiedu.proxy.User;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 功能：
 * 作者：HZj
 * 日期：2024/12/27 0:04
 */
/*
* AOP开发中的一个坑
* 坑：在同一个业务类中，进行业务方法之间的相互调用，只有最外层的方法，才是加入了额外功能（内部的方法，通过普通的方式调用，都调用的是原始方法）。
* 如果想让内层的方法也调用代理对象的方法，就要通过ApplicationContextAware获得工厂，进而获得代理对象
*
* */
public class UserServiceImpl implements UserService, ApplicationContextAware {
    private ApplicationContext ctx;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx = applicationContext;
    }

    @Override
    public boolean login(String name, String password) {
        System.out.println("UserServiceImpl.login");
        return true;
    }

    @Override
    public void register(User user) {
        System.out.println("UserServiceImpl.register");

        //调用的是原始对象的loging方法 ---> 核心功能
        /*
        * 设计目的：代理对象的login方法 ---> 额外功能+核心功能
        * ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext2.xml");
        * UserService userService = (UserService)ctx.getBean("userService");
        * userService.login();
        *
        * Spring工厂重量级资源 一个应用中 应该只能创建一个工厂
        *
        */
        UserService userService = (UserService) ctx.getBean("userService");
        userService.login("suns","1234");
    }


}
